package com.example.springbooteasycode.zjrc.project.OuterMidProd.command11;

/**
 * trim：纯 Java 实现首尾空格去除，与 C 自定义 trim 功能对齐。
 *
 * strlen 功能：
 * 用于计算字符串长度（到 \0 终止符为止），在 Cmd11 中判断节点 ID 长度是否符合要求（if(strlen(in) != NODEID_LEN) ）。
 * 对输入 "4E42544330303031" ，strlen 会返回 8（假设 NODEID_LEN 是 8 ，匹配文档中 “节点号长度 8” 的要求 ）。
 */
public class NodeCommandHandler {
    // 假设节点 ID 长度固定为 8（匹配文档“节点号长度 8”）
    private static final int NODEID_LEN = 8;
    // 应答码常量，可根据实际需求扩展
    private static final String ACK_SUCCESS = "A";
    private static final String ACK_ERROR = "E";

    /**
     * 模拟 C 中的 SndUnit 结构体，存储指令数据
     */
    static class SndUnit {
        // 数据内容，替代 C 的字符数组
        byte[] bData;
        // 数据长度，替代 C 的 dwLen
        int dwLen;

        public SndUnit(int capacity) {
            this.bData = new byte[capacity];
            this.dwLen = 0;
        }
    }

    /**
     * 自定义 trim 函数，去除字符串首尾空格
     */
    public static String trim(String str) {
        if (str == null) return "";
        // 去掉尾部空格
        int end = str.length() - 1;
        while (end >= 0 && str.charAt(end) == ' ') {
            end--;
        }
        // 去掉首部空格
        int start = 0;
        while (start <= end && str.charAt(start) == ' ') {
            start++;
        }
        // 截取有效部分
        return str.substring(start, end + 1);
    }

    /**
     * 模拟 C 的 Cmd11 指令处理逻辑
     * @param input 完整指令（示例："0009114E42544330303031"）
     */
    public static SndUnit cmd11(String input) {
        SndUnit sndUn = new SndUnit(1024); // 初始化数据存储结构

        // 1. 解析指令：先提取节点信息（假设输入格式固定）
        // 长度域 "0009" -> 总长度 9（十六进制转十进制是 9）
        // 指令码 "11" -> 对应增加节点指令
        // 节点信息 "4E42544330303031" -> 长度 8
        String nodeInfoHex = input.substring(6); // 跳过前 6 位（"000911"），取节点信息
        // 十六进制转字符串（假设是 ASCII 编码，如之前 "NBTC0001" 转 hex 是 "4E42544330303031"）
        String nodeInfo = hexToAscii(nodeInfoHex);
        System.out.println("节点信息：" + nodeInfo);

        // 2. 调用 trim 处理
        String trimmedNode = trim(nodeInfo);

        // 3. 长度校验（匹配 NODEID_LEN）
        if (trimmedNode.length() != NODEID_LEN) {
            // 模拟错误处理：设置错误应答码，这里简单返回 null 或抛异常，实际需按协议返回错误码
            System.err.println("节点 ID 长度错误！期望 " + NODEID_LEN + "，实际 " + trimmedNode.length());
            return null;
        }

        // 4. 业务逻辑：假设校验通过，构造响应（这里简化为直接返回处理后的数据）
        // 模拟将处理后的节点信息存入 SndUnit
        byte[] responseData = trimmedNode.getBytes();
        System.arraycopy(responseData, 0, sndUn.bData, 0, responseData.length);
        sndUn.dwLen = responseData.length;

        return sndUn;
    }

    /**
     * 辅助方法：十六进制字符串转 ASCII 字符串
     */
    public static String hexToAscii(String hexStr) {
        StringBuilder output = new StringBuilder();
        for (int i = 0; i < hexStr.length(); i += 2) {
            String hexByte = hexStr.substring(i, i + 2);
            output.append((char) Integer.parseInt(hexByte, 16));
        }
        return output.toString();
    }

    // 测试示例
    public static void main(String[] args) {
        // 输入指令："0009"（长度） + "11"（指令） + "4E42544330303031"（节点信息 hex）
        String inputCmd = "0009114E42544330303031";
        SndUnit result = cmd11(inputCmd);

        if (result != null) {
            System.out.println("处理成功！响应数据长度：" + result.dwLen);
            System.out.println("响应内容：" + new String(result.bData, 0, result.dwLen));
        }
    }
}
